<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <pre>
        面向对象三大特征：
        1) 封装
              将数据或逻辑功能写在代码块中，使用时通过调用来代替原始代码。
              隐藏内部细节，返回处理结果。
              将数据存储到属性中，将逻辑功能存储到方法中，将描述的对象特征存储到构造函数“类”中。

        2) 继承
              将父类特征传递给子类对象拥有的一种方式
              可通过原型链来实现继承：将一个原型的特征传递给另一个原型对象
              原型链：多个原型对象之间有语法上的联系
              一旦子类继承到父类特征，那么该特征就是子类自身具有了。

              实现方式一：
                  在上级构造函数/原型对象中都存储数据，下级原型对象都能获取到
                  子类构造函数.prototype =  new 父类() 

              实现方式二：
                  只在上级原型对象中存储数据，下级原型对象只获取原型数据
                  子类构造函数.prototype =  父类构造函数.prototype
                  注意：
                        父类子类的prototype都指向同一处内存地址,所以改任何一个原型数据，另一个都会变

              实现方式三：
                  将父类原型赋值给空对象原型，再将空对象赋给子类原型。
                  var Fn = function(){};
                  Fn.prototype = Father.prototype
                  Son.prototype = new Fn()
                  注意：原型链的结构有误：子类对象的构造函数constructor指向了父类构造函数constructor
                  更改构造函数：
                      Son.prototype.constructor = Son;
              
              实现方式四：子类通过call()或apply()方法借调父类构造函数
                  在子类构造函数中写：父类构造函数名.call(this)/apply(this)
                  只能获取到父类构造函数中的数据，获取不到原型里的数据
                  注意：
                        call(this,参数1,参数2...) 传参时参数一一列出
                        apply(this,数组)  传参时用数组
            
              实现方式五：组合继承 [看成方式三和方式四的结合]
                  将构造函数和原型结合在一起，实例数据由构造函数提供，原型数据由原型对象提供

              实现方式六：拷贝继承
                  将父类原型中的所有特征获取并循环赋值给子类原型

        3) 多态：编译时和运行时结果不同 [不作为掌握的知识点]
                /* js的面向对象不支持
                表现形式：(1)同一个构造函数中，方法名相同，参数列表不同
                              但是JS中构造函数内的同名函数会覆盖，从而失去多态的效果。
                         (2)在父子类中，子类方法与父类方法用名，优先调用子类的
                              但是JS中构造函数内的同名子类函数会覆盖同名父类函数，从而失去多态的效果。  
                         (3)子类替换父类[基于有类型的] 
                              父类作为形参，被子类实参替换
                              父类作为返回值类型，给返回结果子类替换
                */
        设置原型对象的数据：
            构造函数名.prototype.属性/方法
            对象名.__proto__.属性/方法

        for-in循环：
            可以循环数组、对象、对象数组的
            循环的变量i表示key/属性名/函数名

    </pre>
    <script type="text/javascript" src="js/chapter9.js"></script>
</body>
</html>